import { IsOptional, IsString, IsEmail, IsEnum, IsDateString, Length, Matches, IsNumber, IsInt, Min, Max } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';
import { Transform } from 'class-transformer';

export enum Gender {
  SECRET = 0,
  MALE = 1,
  FEMALE = 2,
}

export class UpdateProfileDto {
  @ApiProperty({ description: '昵称', required: false })
  @IsOptional()
  @IsString()
  @Length(2, 20, { message: '昵称长度应在2-20个字符之间' })
  nickname?: string;

  @ApiProperty({ description: '头像URL', required: false })
  @IsOptional()
  @IsString()
  avatar?: string;

  @ApiProperty({ description: '邮箱', required: false })
  @IsOptional()
  @IsEmail({}, { message: '请输入有效的邮箱地址' })
  email?: string;

  @ApiProperty({ description: '个人简介', required: false })
  @IsOptional()
  @IsString()
  @Length(0, 200, { message: '个人简介不能超过200个字符' })
  bio?: string;

  @ApiProperty({ description: '性别', enum: Gender, required: false })
  @IsOptional()
  @Transform(({ value }) => {
    // 确保 gender 是数字类型
    if (value === '' || value === null || value === undefined) {
      return 0; // 默认为保密
    }
    return Number(value);
  })
  @IsInt({ message: '性别必须是整数' })
  @Min(0, { message: '性别值无效' })
  @Max(2, { message: '性别值无效' })
  gender?: number;

  @ApiProperty({ description: '生日', required: false, example: '1990-01-01' })
  @IsOptional()
  @Transform(({ value }) => {
    // 如果 birthday 是空字符串或 null 或 undefined，返回 null
    if (value === '' || value === null || value === undefined) {
      return null;
    }
    
    // 如果 birthday 是有效的日期字符串，转换为 YYYY-MM-DD 格式
    if (value && typeof value === 'string') {
      try {
        const date = new Date(value);
        if (isNaN(date.getTime())) {
          return null; // 如果日期无效，返回 null
        }
        return date.toISOString().split('T')[0]; // 返回 YYYY-MM-DD 格式
      } catch (error) {
        return null; // 如果转换失败，返回 null
      }
    }
    
    return value;
  })
  @Matches(/^\d{4}-\d{2}-\d{2}$|^$/, { 
    message: '生日格式无效，请使用 YYYY-MM-DD 格式',
    each: false 
  })
  birthday?: string;

  @ApiProperty({ description: '省份', required: false })
  @IsOptional()
  @IsString()
  province?: string;

  @ApiProperty({ description: '城市', required: false })
  @IsOptional()
  @IsString()
  city?: string;

  @ApiProperty({ description: '用户名', required: false })
  @IsOptional()
  @IsString()
  @Length(2, 20, { message: '用户名长度应在2-20个字符之间' })
  @Matches(/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/, { message: '用户名只能包含字母、数字、下划线和中文' })
  username?: string;
}





